package org.goldfish.distributed_framework.api;

import org.goldfish.distributed_framework.client.*;

import java.lang.annotation.Annotation;
import java.util.*;
import java.lang.reflect.Method;

public interface Service {

    // 默认的 handleRequest 实现，利用反射动态查找匹配的方法
    default RpcResponse handleRequest(RpcRequest request) {
        try {
            // 获取当前类的所有方法
            Method[] methods = this.getClass().getDeclaredMethods();
            // 遍历所有方法
            for (Method method : methods) {
                Annotation annotation = method.getAnnotation(RpcMethod.class);
                System.out.println("扫描到" + method.getName() + "方法");
                System.out.println("扫描到" + annotation + "注解");
                if (annotation == null)
                    continue;
                var paramTypes = method.getParameterTypes();
                System.out.println("扫描到\n\t" + Arrays.toString(paramTypes) + "\n参数类型");
                var parameters = request.getParameters();
                System.out.println("要求参数类型：\n\t"+ Arrays.toString(parameters));
                boolean compareResult = Arrays.equals(paramTypes, request.getParamTypes());
                System.out.println("参数类型对比结果：\n\t"+ compareResult);
                // 匹配方法名和参数类型
                if (compareResult) {
                    // 如果找到匹配的方法，则调用它
                    method.setAccessible(true);  // 使方法可访问
                    System.out.println("找到匹配的方法：\n\t"+ method.getName());
                    System.out.println("传入参数"+ Arrays.toString(parameters));
                    Object result = method.invoke(this, parameters);  // 调用方法并传入参数
                    // 根据方法返回值构造 RpcResponse
                    return RpcResponse.success(result);
                }
            }
            // 如果没有找到匹配的方法，返回失败的 RpcResponse
            return RpcResponse.failure("No matching method found for: " + request.getMethodName());
        } catch (Exception e) {
            // 发生异常时返回失败的 RpcResponse
            e.printStackTrace();
            return RpcResponse.failure("Error occurred while invoking method: " + e.getMessage());
        }
    }
}
